Lambda(Python3)でBoto3を利用時に「Unknown service: ‘xxxxx’」と表示された場合の対処法
こんにちは、コンサル部@大阪オフィスのTodaです。
LambdaでBoto3を利用していると「Unknown service: 'xxxxx'」というエラーが表示されて処理ができないときがあります。
今回は上記エラーが出た場合の対処方法を確認してみました。
エラーの原因
エラーの原因は下記2点が考えられます。
- Boto3のclientでサービス名の入力間違い
- Boto3のライブラリバージョンで該当のサービスがサポートされていない
前者の場合は、入力内容を修正すれば解決できるのですが、後者の場合は対応が必要になります。
LambdaにはBoto3があらかじめ導入されていて、利用者側で導入する必要がないようになっています、ただし導入されているBoto3のバージョンは最新でない場合がございます。
2021/7/8時点でLambda Python3では「boto3-1.17.42」となっています。
最新のBoto3は「boto3-1.17.106」なので、バージョンの違いによりサポートされるサービスに違いがあります。
■ Lambda ランタイム
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html
■ Boto3 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html
比較をすると下記サービスが「boto3-1.17.42」でサポートされていないことがわかりました。
- accessanalyzer
- applicationcostprofiler
- apprunner
- finspace
- finspace-data
- lookoutequipment
- mgn
- nimble
- proton
- ssm-contacts
- ssm-incidents
該当のサービスに関する処理を行う場合は、Boto3のライブラリバージョンを上げる必要があります。
今回は、Lambda Layerを使って対応をしてみました。
前提条件
作業用のPCにPython3.8または3.7, 3.6 と pipが実行できる環境が必要になります。
作業前の確認
作業前にLambdaに設定されているBoto3のバージョンを確認いたします。
Lambdaで下記プログラムを入力してテストイベントを実行します。
import json import botocore import boto3 def lambda_handler(event, context): print('botocore vertion: {0}'.format(botocore.__version__)) print('boto3 vertion: {0}'.format(boto3.__version__))
実行結果
Function Logs START RequestId: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx Version: $LATEST botocore vertion: 1.20.42 boto3 vertion: 1.17.42
boto3のバージョンが「1.17.42」であることを確認しました。
対応してみる
Lambda Layerに設定するBoto3の準備
Lambda Layerに設定する用に最新のBoto3を取得してZipファイルに圧縮をします。
作業はディレクトリを作成しておこないます。
boto3を取得すると関連するライブラリとしてbotocore, dateutil, jmespath, s3transfer, urllib3も取得されます。
全てのファイルを圧縮にて保存します。
現在、最新のBoto3をレイヤーに指定する場合は、Zip解凍時の直下のディレクトリ名は「python」にする必要があることがわかりました。
ディレクトリ名を変更するコマンドを下記追加しています。
% mkdir [作業用ディレクトリ] % pip install -t ./[作業用ディレクトリ] boto3 % mv ./[作業用ディレクトリ] ./python % zip -r boto3-1.17.106.zip ./python
Lambda Layerの設定
AWSマネージメントコンソールのサービスから[Lambda]をクリックします。
左メニューの[レイヤー]をクリックして、一覧上部の[レイヤーの作成]をクリックします。
レイヤー設定では、先ほど作成したZipファイル設定してその他項目を入力します。
入力後は[作成]をクリックします。
- 名前 : boto3-1_17_106 ※任意
- 説明 : Boto3 1.17.106 ※任意
- 互換性のあるランタイム : Python 3.8, 3.7, 3.6
下記画面が表示されると登録は完了になります。
Lambda Layerの適用
登録したLambda LayerをLambda関数で利用できるように設定します。
対象関数の設定画面に移動をしてレイヤー項目の[レイヤー追加]をクリックします。
レイヤーの選択が表示されますので[カスタムレイヤー]を選択頂き、先ほど登録したレイヤーを選択します。
バージョンは初期登録の時点で1のみ選択できますのでそのまま指定します。
入力後は[追加]をクリックして登録を完了します。
上記でBoto3のライブラリのバージョン変更は完了になります。
作業後の確認
作業前にBoto3のライブラリバージョンを確認するプログラムを再度実行します。
実行結果
Function Logs START RequestId: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx Version: $LATEST botocore vertion: 1.20.106 boto3 vertion: 1.17.106
boto3のバージョンが「1.17.106」に変わっている事が確認できました。
上記で、エラーが表示されていたサービスも利用可能になります。
さいごに
今回はLambdaで「Unknown service: 'xxxxx'」のエラーが表示された場合の対処法を確認してみました。
少しでもお客様の作りたい物の参考になればと考えております。
変更履歴
・当初Python3.8の利用を想定していましたが、3.6, 3.7でも同等の対応にてboto3のバージョン変更ができることを確認できましたのでPythonの表示を「Python3」または「Python3.8または3.7, 3.6」に変更